/**
 * 统一错误处理工具
 * 提供一致的错误处理方式和用户提示
 */

/**
 * 错误类型枚举
 */
export const ERROR_TYPES = {
	NETWORK: 'NETWORK',
	AUTH: 'AUTH',
	API: 'API',
	USER: 'USER',
	UNKNOWN: 'UNKNOWN'
}

/**
 * 错误消息映射
 */
const ERROR_MESSAGES = {
	[ERROR_TYPES.NETWORK]: {
		title: '网络错误',
		content: '网络连接失败，请检查网络设置后重试'
	},
	[ERROR_TYPES.AUTH]: {
		title: '授权失败',
		content: '用户拒绝授权，请重新授权后重试'
	},
	[ERROR_TYPES.API]: {
		title: '服务异常',
		content: '服务器暂时不可用，请稍后重试'
	},
	[ERROR_TYPES.USER]: {
		title: '操作失败',
		content: '操作失败，请重试'
	},
	[ERROR_TYPES.UNKNOWN]: {
		title: '未知错误',
		content: '发生未知错误，请重试'
	}
}

/**
 * 错误处理器类
 */
class ErrorHandler {
	/**
	 * 处理错误并显示用户友好的提示
	 * @param {Error} error 错误对象
	 * @param {string} context 错误上下文
	 * @param {boolean} showModal 是否显示模态框
	 */
	static handle(error, context = '', showModal = false) {
		console.error(`❌ 错误 [${context}]:`, error)
		
		// 确定错误类型
		const errorType = this.getErrorType(error)
		
		// 获取错误消息
		const errorMessage = ERROR_MESSAGES[errorType]
		
		// 显示Toast提示
		uni.showToast({
			title: errorMessage.title,
			icon: 'none',
			duration: 3000
		})
		
		// 如果需要显示模态框
		if (showModal) {
			setTimeout(() => {
				uni.showModal({
					title: errorMessage.title,
					content: errorMessage.content,
					showCancel: false,
					confirmText: '知道了'
				})
			}, 1000)
		}
		
		return errorType
	}
	
	/**
	 * 根据错误对象确定错误类型
	 * @param {Error} error 错误对象
	 * @returns {string} 错误类型
	 */
	static getErrorType(error) {
		const message = error.message || ''
		const errMsg = error.errMsg || ''
		
		// 网络相关错误
		if (message.includes('ERR_NAME_NOT_RESOLVED') || 
			message.includes('网络请求失败') ||
			errMsg.includes('request:fail')) {
			return ERROR_TYPES.NETWORK
		}
		
		// 授权相关错误
		if (message.includes('auth deny') || 
			message.includes('用户拒绝授权') ||
			errMsg.includes('auth deny')) {
			return ERROR_TYPES.AUTH
		}
		
		// API相关错误
		if (message.includes('微信API调用失败') || 
			message.includes('API请求失败') ||
			error.errcode) {
			return ERROR_TYPES.API
		}
		
		// 用户操作错误
		if (message.includes('操作失败') || 
			message.includes('获取失败')) {
			return ERROR_TYPES.USER
		}
		
		return ERROR_TYPES.UNKNOWN
	}
	
	/**
	 * 显示成功提示
	 * @param {string} message 成功消息
	 * @param {string} icon 图标类型
	 */
	static showSuccess(message = '操作成功', icon = 'success') {
		uni.showToast({
			title: message,
			icon: icon,
			duration: 2000
		})
	}
	
	/**
	 * 显示加载提示
	 * @param {string} title 加载提示文字
	 * @param {boolean} mask 是否显示遮罩
	 */
	static showLoading(title = '加载中...', mask = true) {
		uni.showLoading({
			title: title,
			mask: mask
		})
	}
	
	/**
	 * 隐藏加载提示
	 */
	static hideLoading() {
		uni.hideLoading()
	}
	
	/**
	 * 显示确认对话框
	 * @param {string} title 标题
	 * @param {string} content 内容
	 * @param {Function} onConfirm 确认回调
	 * @param {Function} onCancel 取消回调
	 */
	static showConfirm(title, content, onConfirm, onCancel) {
		uni.showModal({
			title: title,
			content: content,
			success: (res) => {
				if (res.confirm && onConfirm) {
					onConfirm()
				} else if (res.cancel && onCancel) {
					onCancel()
				}
			}
		})
	}
	
	/**
	 * 显示信息对话框
	 * @param {string} title 标题
	 * @param {string} content 内容
	 * @param {Function} onConfirm 确认回调
	 */
	static showInfo(title, content, onConfirm) {
		uni.showModal({
			title: title,
			content: content,
			showCancel: false,
			confirmText: '知道了',
			success: (res) => {
				if (res.confirm && onConfirm) {
					onConfirm()
				}
			}
		})
	}
}

export default ErrorHandler 